AWS再入門2022 AWS ElastiCacheについて
こんにちは、白石です。
当エントリは弊社コンサルティング部による『AWS 再入門ブログリレー 2022』の 10日目のエントリです。
このブログリレーの企画は、普段 AWS サービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。
AWSをこれから学ぼう!という方にとっては文字通りの入門記事として、またすでにAWSを活用されている方にとってもAWSサービスの再発見や2022年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。1つでも知らない機能があり、学びにつながれば幸いです。
では、さっそくいってみましょう。10日目のテーマはAmazon ElastiCacheです。
Amazon ElastiCache とは?
Amazon ElastiCache は、柔軟なリアルタイムのユースケースをサポートするフルマネージドのインメモリキャッシングサービスで、Memcached または Redis プロトコルに互換性があります。
特徴
読み込み量が多いアプリケーションの大量の作業負荷 (ソーシャルネットワーキング、ゲーム、メディア共有、Q&A ポータルなど) や莫大な計算処理を必要とする作業負荷 (レコメンデーションエンジンなど) におけるレイテンシーやスループットを改善するために使用することができます。さらに、Redis は高度なデータ構造をサポートしているため、コスト効率が高い方法で、データベース層を拡張し、データベース経由では簡単に達成できない機能を実行できます。
Amazon ElastiCache の特徴
料金
オンデマンドノードは、1時間あたりの課金となり、リザーブドノードは、1年または3年での支払いになります。 これらに加えて、バックアップストレージとデータ転送(リージョン内/外)、ElastiCache for Outposts利用可否によって値段が決まります。
ユースケース
ビジネスユースケースにおいて、最もユーザーが必要としている/より多くアクセスされるデータを高速にレスポンスとして返したい際、データをキャッシュし利用します。 アプリケーションとデータベースパフォーマンスを高速化するキャッシングに使ったり、セッションストア、ゲーミングリーダーボード、ストリーミング、および分析などの耐久性を必要としないユースケースのプライマリデータストアとして使用することができます。
個人的な経験上、マルチプレーヤーゲームにおけるユーザーランキング計算/表示、Formデータ計算結果の一時保存、各ユーザー状態に依存する分岐条件、また、抽選サイトや配信サイトのセッションデータ、レコメンデーション、DBデータの一時退避・冗長退避など、多くの場面で使うことが出来る印象です。
後述で紹介しているブログ内にあります、どんなデータを保存したら良いの?も、とても参考になりますので、ぜひご一読ください。
Memcached と Redis の比較
個人的には、下記公式リファレンスより、Memcachedの説明文にある「できるだけシンプルなモデルが必要である。」が、的を得て重要なのではないかと思いました。これは、詰まるところ、キャッシュを利用するにあたり、そのプロダクトで扱う各ノードの構成、データ型の複雑性やソート、バックアップと復元性、(並行)処理やイベント通知方法など、一つ一つ判断していく必要があると考えるからです。
選択の判断に関しては、過去、弊社ブログでも紹介されており、とても参考になります。
ノード、シャード、クラスターとは?
上記のリファレンスや記事でも出てくる、「ノード、シャード、クラスター」についての説明です。
ノードとは、Amazon ElastiCache をデプロイするときの最小構成要素です。これは、ネットワークに接続されたセキュアな RAM の固定サイズの断片です。各ノードでは Memcached または Redis プロトコル準拠サービスのインスタンスが実行され、それぞれの DNS 名とポートがあります。関連付けられているメモリ量の異なる、複数タイプのノードがサポートされています。Redis シャードは、クラスターのキースペースのサブセットで、プライマリノードおよびゼロ個以上のリードレプリカを含めることができます。Redis デプロイメントの詳細については、下の Redis についてのセクションを参照してください。クラスターは複数のシャードによって形成されます。
Amazon ElastiCache のノード、シャード、クラスターとは何ですか?
シャードは、詰まるところノードのグループです。
シャード (API と CLI ではノードグループ) はノードの階層的配列であり、
Redis のノードとシャード
チュートリアル
ElastiCacheのハンズオンが3つ公開されています。
手始めに Amazon ElastiCache for Redis を使い、MySQL データベースのパフォーマンスを向上させる をやってみました。
構成は下記で、実行コードはこちらです。
やってることとしては、1つ目の関数は、Redis上の値の存在チェックを行ない、値が存在しない場合はデータベースにSQLで問い合わせています。その後、問い合わせた結果を、Redisに保存しています。2つ目の関数は、単にキャッシュまたは、データベースからid指定(key)でレコードを取得しています。
ファイル構成
(venv) [ec2-user@ip-xxx-xx-x-x database-caching]$ ls INSTALL README.md __pycache__ example.py example.pyc images requirements.txt seed.sql venv
(venv) [ec2-user@ip-xxx-xx-x-x database-caching]$ cat requirements.txt PyMySQL==0.9.3 redis==3.2.1
ポイント
- 気づいたら venv 環境下におらず、コマンドが通らない...場合は、焦らず「チュートリアル概要の前提条件」のコマンドに立ち返りましょう
- 各STEPにて書かれてはいますが、もしMySQLやElastiCacheへの通信が出来ない場合は、セキュリティグループのインバウンドを見直して見て下さい
- L59 f"" 部分で Invalid Syntax が出る
- こちらの記事 を参考にさせていただき、該当部分を
"".format()
に書き換えました。実際にエラーが出た環境も3系でした。(venv) [ec2-user@ip-xxx-xx-x-x database-caching]$ python --version Python 3.7.10
def planet(id): """Retrieve a record from the cache, or else from the database.""" key = "planet:{id}".format() res = Cache.hgetall(key)
- こちらの記事 を参考にさせていただき、該当部分を
- シェルから python を実行する方法
(venv) [ec2-user@ip-xxx-xx-x-x database-caching]$ python -c 'import example; print(example.fetch("SELECT * FROM planet"))' [{'id': 1, 'name': 'Mercury'}, {'id': 2, 'name': 'Venus'}, {'id': 3, 'name': 'Earth'}, {'id': 4, 'name': 'Mars'}, {'id': 5, 'name': 'Jupiter'}, {'id': 6, 'name': 'Saturn'}, {'id': 7, 'name': 'Uranus'}, {'id': 8, 'name': 'Neptune'}]
合わせて読みたい
.
最後に
これまで何気無く利用してきたキャッシュサービスも、実際に実装してみることで理解が深まります。
チュートリアルと動画 には、入門向け/上級者向け動画として、AWS re:Invent 2020
時点で紹介された Amazon ElastiCache の新機能やベストプラクティスへのリンクが掲載されています。
より具体的な実装イメージがわきそうなので、次はAmazon Aurora Serverless と Amazon ElastiCache を使用してリアルタイムなリーダーボードをビルドするハンズオンにチャレンジしてみたいと思います。
以上、『AWS 再入門ブログリレー 2022』の 10日目のエントリ『AWS Elasticache』編でした。
明日 (2/16) は、川村さんの 「Amazon Transcribe」の予定です。お楽しみに!!